package com.xiaobange.exception;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.exception.SaTokenException;
import com.xiaobange.utils.ResponseCodeEnum;
import com.xiaobange.vo.ResultResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


/**
 * @version 1.0
 * @Author 小班哥
 * @Date 2025/4/26 14:00
 * @Explain 全局异常处理器
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 自定异常
     * @param exception
     * @return
     */
    @ExceptionHandler(ServiceException.class)
    @ResponseBody
    public ResultResponse<ServiceException> serviceException(ServiceException exception){
        return ResultResponse.error(exception.getCode(),exception.getMessage());
    }

    /**
     * sa-token权限相关异常
     * @param exception
     * @return
     */
    @ExceptionHandler({NotPermissionException.class, NotRoleException.class})
    @ResponseBody
    public ResultResponse<ServiceException> NotPermissionException(SaTokenException exception){
        return ResultResponse.error(ResponseCodeEnum.FORBIDDEN.getCode(),ResponseCodeEnum.FORBIDDEN.getMessage());
    }


    /**
     * 登录校验失败异常
     *
     * -1	NotLoginException.NOT_TOKEN	未能从请求中读取到有效 token
     * -2	NotLoginException.INVALID_TOKEN	已读取到 token，但是 token 无效
     * -3	NotLoginException.TOKEN_TIMEOUT	已读取到 token，但是 token 已经过期 (详)
     * -4	NotLoginException.BE_REPLACED	已读取到 token，但是 token 已被顶下线
     * -5	NotLoginException.KICK_OUT	已读取到 token，但是 token 已被踢下线
     * -6	NotLoginException.TOKEN_FREEZE	已读取到 token，但是 token 已被冻结
     * -7	NotLoginException.NO_PREFIX	未按照指定前缀提交 token
     * @param exception
     * @return
     */
    @ExceptionHandler(NotLoginException.class)
    @ResponseBody
    public ResultResponse<ServiceException> NotLoginException(NotLoginException exception){
        String message = switch (exception.getType()) {
            case "-1" -> "未查询到您的登录数据！请重新登录";
            case "-2" -> "您的登录状态无效，请重新登录";
            case "-3" -> "您的登录状态已过期，请重新登录";
            case "-4" -> "你的账号已在别处登录，如不是本人操作请修改密码";
            case "-5" -> "您已被踢下线";
            case "-6" -> "您的账号已被冻结";
            case "-7" -> "未按照指定前缀提交 token";
            default -> "未知错误，请联系开发人员";
        };
        return ResultResponse.error(ResponseCodeEnum.UNAUTHORIZED.getCode(),message);
    }

}
